package com.gzist.springailab05.rag;

import com.alibaba.cloud.ai.advisor.RetrievalRerankAdvisor;
import com.alibaba.cloud.ai.model.RerankModel;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.chat.client.advisor.api.Advisor;
import org.springframework.ai.vectorstore.SearchRequest;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 创建自定义的 RAG 检索重排序增强顾问
 */
@Slf4j
@Configuration
@RequiredArgsConstructor
public class RetrievalRerankAdvisorConfig {

    private final VectorStore vectorStore;
    private final RerankModel rerankModel;

    // 用户提示词模板（重排序阶段）
    private final static String USER_PROMPT_RERANK = """
            以下是知识库检索信息：
            --------------------
            {question_answer_context}
            --------------------

            请基于上述信息，结合历史对话内容回答用户问题。回答应：
            1. 内容完整且紧扣问题核心
            2. 避免直接摘抄原文，需语义转化
            3. 语言简洁专业，逻辑清晰连贯
            4. 若信息不足请礼貌告知用户

            回答建议：先直接回应问题关键，再展开必要解释，确保用户获得准确且易于理解的信息。
            """;
    @Bean
    public Advisor retrievalRerankAdvisor() {
        // 配置搜索参数
        SearchRequest searchRequest = SearchRequest.builder()
                .similarityThreshold(0.2)
                .topK(7)
                .build();
                
        return new RetrievalRerankAdvisor(
                vectorStore,
                rerankModel,
                searchRequest,
                // 创建带变量注入的模板文本(只能存在一个变量即最终的检索结果)
                USER_PROMPT_RERANK,
                0.6  // 重排序阈值
        );
    }
}
